package com.stark.wechat.util;

import com.fasterxml.jackson.databind.JsonNode;
import com.stark.wechat.core.GlobalErrorCode;
import com.stark.wechat.exception.WechatException;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * 响应工具类
 *
 * @author <a href="mailto:mengbin@hotmail.com">Ben</a>
 * @version 1.0.0
 * @since 2025/8/25
 */
public class ResponseUtils {

    /**
     * 查找错误信息并抛出异常
     * <p>异常信息获取规则如下：
     * <ol>
     *     <li>errcode 为空或 0 时不抛异常；</li>
     *     <li>首先从方法级错误代码集合中获取错误信息；</li>
     *     <li>其次从全局错误代码集合中获取错误信息；</li>
     *     <li>最后取传入的 errmsg 。</li>
     * </ol>
     *
     * @param opt           方法描述
     * @param root          响应的 JSON 根节点
     * @param methodCodeMap 方法级错误代码集合
     */
    public static void findError(String opt, JsonNode root, Map<Long, String> methodCodeMap) {
        if (!root.has("errcode")) {
            return;
        }

        long errcode = root.get("errcode").asLong();
        String errmsg = root.get("errmsg").asText();
        if (errcode == 0) {
            return;
        }

        String _errmsg;
        if (methodCodeMap != null && methodCodeMap.containsKey(errcode)) {
            _errmsg = methodCodeMap.get(errcode);
        } else {
            _errmsg = GlobalErrorCode.getDesc(errcode);
        }
        if (StringUtils.isBlank(_errmsg)) {
            _errmsg = errmsg;
        }
        throw new WechatException(opt + "失败: " + errcode + "-" + _errmsg);
    }

}
